//-----------------------------------------------------------------------------
// Filename: ByteBuffer.cs
//
// Description: Provides some useful methods for working with byte[] buffers.
//
// History:
// 04 May 2006	Aaron Clauson	Created.
//-----------------------------------------------------------------------------

using System;
using System.Text;

#if UNITTEST
using NUnit.Framework;
#endif

namespace CN.Sys.Net
{
	public class ByteBufferInfo
	{
		/// <summary>
		/// Searches a buffer for a string up until a specified end string.
		/// </summary>
		/// <param name="buffer"></param>
		/// <param name="find"></param>
		/// <param name="end"></param>
		/// <returns></returns>
		public static bool HasString(byte[] buffer, string find, string end)
		{
			if(buffer == null || buffer.Length == 0 || find == null || find.Trim().Length == 0)
			{
				return false;
			}
			else
			{
				byte[] findArray = Encoding.ASCII.GetBytes(find);
				byte[] endArray = (end != null) ? Encoding.ASCII.GetBytes(end) : null;

				int findPosn = 0;
				int endPosn = 0;

				for(int index=0; index<buffer.Length; index++)
				{
					if(buffer[index] == findArray[findPosn])
					{
						findPosn++;
					}
					else
					{
						findPosn = 0;
					}

					if(endArray != null && buffer[index] == endArray[endPosn])
					{
						endPosn++;
					}
					else
					{
						endPosn = 0;
					}

					if(findPosn == findArray.Length)
					{
						return true;
					}
					else if(endArray != null && endPosn == endArray.Length)
					{
						return false;
					}
				}

				return false;
			}
		}

		#region Unit testing.

		#if UNITTEST
	
		[TestFixture]
		public class SIPURIUnitTest
		{
			[TestFixtureSetUp]
			public void Init()
			{
				
			}

			
			[TestFixtureTearDown]
			public void Dispose()
			{			
				
			}

			
			[Test]
			public void SampleTest()
			{
				Console.WriteLine(System.Reflection.MethodBase.GetCurrentMethod().Name);
				
				Assert.IsTrue(true, "True was false.");
			}

			[Test]
			public void HasStringUnitTest()
			{
				Console.WriteLine(System.Reflection.MethodBase.GetCurrentMethod().Name);

				byte[] sample = Encoding.ASCII.GetBytes("The quick brown fox jumped over...");

				bool hasFox = ByteBuffer.HasString(sample, "fox", null);
				
				Assert.IsTrue(hasFox, "The string was not found in the buffer.");
			}

			[Test]
			public void NotBeforeEndUnitTest()
			{
				Console.WriteLine(System.Reflection.MethodBase.GetCurrentMethod().Name);

				byte[] sample = Encoding.ASCII.GetBytes("The quick brown fox jumped over...");

				bool hasFox = ByteBuffer.HasString(sample, "fox", "brown");
				
				Assert.IsTrue(!hasFox, "The string was not found in the buffer.");
			}
		}

		#endif

		#endregion
	}
}
